import { defineEventHandler, getRouterParam, readBody, setResponseHeaders } from "h3"; import { getCurrentUser, getConfigUser, getConfigGlobal } from "#server/utils/context"; import { resolveAgentIdentity } from "#server/service/agent/identity"; import { getSessionByIdAndUser } from "#server/service/agent/session"; import { getAgentBySlug } from "#server/service/agent/agent"; import { executeChat } from "#server/service/agent/chat-engine"; import { registerAbortController, unregisterAbortController } from "#server/service/agent/abort-manager"; export default defineEventHandler(async (event) => { const agentSlug = getRouterParam(event, "agentSlug"); if (!agentSlug) { throw createError({ statusCode: 400, statusMessage: "参数无效" }); } const agent = await getAgentBySlug(agentSlug); if (!agent) { throw createError({ statusCode: 404, statusMessage: "agent 不存在" }); } const identity = await resolveAgentIdentity(event); if (!identity.userId && !identity.tempToken) { throw createError({ statusCode: 401, statusMessage: "请先登录或创建临时会话" }); } const body = await readBody(event); const { sessionId, content, editMessageId, regenerate, continueAfterApproval, approvalToolCallId, approved, approvalReason, enableThinking, enableTools } = body as { sessionId: string; content: string; editMessageId?: string; regenerate?: boolean; continueAfterApproval?: boolean; approvalToolCallId?: string; approved?: boolean; approvalReason?: string; enableThinking?: boolean; enableTools?: boolean; }; if (!sessionId) { throw createError({ statusCode: 400, statusMessage: "参数无效" }); } const isApprovalContinue = continueAfterApproval === true && approvalToolCallId; if (!isApprovalContinue && (!content || typeof content !== "string" || content.trim().length === 0)) { throw createError({ statusCode: 400, statusMessage: "参数无效" }); } const session = await getSessionByIdAndUser(sessionId, identity.userId, identity.tempToken); if (!session) { throw createError({ statusCode: 404, statusMessage: "会话不存在" }); } if (session.agentId !== agent.id) { throw createError({ statusCode: 400, statusMessage: "会话不属于该 agent" }); } const ip = getRequestIP(event, { xForwardedFor: true }) || "unknown"; let preferredModelId: number | null = null; if (identity.userId) { preferredModelId = (await getConfigUser(event, "preferredLlmModelId")) ?? null; } const globalDefaultModelId = (await getConfigGlobal("agentDefaultModelId")) ?? null; const user = identity.userId ? await getCurrentUser(event) : null; const { response } = await executeChat({ agent, session, user: user ? { id: user.id, role: user.role } : null, tempToken: identity.tempToken, body: { content, editMessageId, regenerate, continueAfterApproval, approvalToolCallId, approved, approvalReason, enableThinking, enableTools, }, ip, preferredModelId, globalDefaultModelId, requestId: event.context.requestId, registerAbort: registerAbortController, unregisterAbort: unregisterAbortController, setRateLimitHeaders: (headers) => { setResponseHeaders(event, headers); }, onClientClose: (cb) => { event.node.req.on("close", cb); }, }); return response; });